package kt02

// TODO lambda上节课 的考试，此考试意味着，考试掌握的话，你后面会轻松 （KT精华 有难度是很正常）
fun main() {

    val r = show01(99) {
        println(it)
        "123456$it"
    }
    println(message = "结果$r ${r is String}")

    show02(1, 2, 3) { n1, n2, n3 ->
        println(n1 + n2 + n3)
    }
// 考试：函数返回一个函数
    val fun4 = fun(n1: Int, n2: Int):  // fun4函数本身
                (Int, Int) -> String // fun4函数的函数 以返回值返回了这个函数
            = { num1, num2 ->
            // fun4函数的函数 以返回值返回了这个函数 的 实现
            "相加的结果是：${n1 + n2} $num1"
        }
    println(fun4(100, 100)(1000, 1000))

    val k01: (String) -> (String) -> (Boolean) -> (Int) -> (String) -> String = {
        val d = it + "1111"
        { it1 ->
            val a = it1 + "1111"
            { it2 ->
                { it3 ->
                    { it4 ->
                        " $d + $a + $it2 + $it3 + $it4"
                    }
                }
            }
        }
    }
    println(k01("AAA")("BBB")(true)(888)("1234"))

    loginEngine("123456", "123456")

    loginEngine2("123456","123456"){
        if (it) println("登录成功") else println("登录失败")
    }
}

// k02.show01 是什么类型的返回 String
fun show01(number: Int, lambda: (Int) -> String) = lambda.invoke(number)

fun show02(number: Int, number2: Int, number3: Int, lambda: (Int, Int, Int) -> Unit) =
    lambda(number, number2, number3)

// 登录功能 高阶函数完成
private fun loginEngine(userName: String, userPwd: String) {
    // 使用高阶函数
    loginServer(userName, userPwd) { name, pwd ->
        if (name == "123456" && pwd == "123456") {
            println("恭喜：$name 登录成功")
        } else println("登录失败")

    }
}

// 高阶函数 规则
private fun loginServer(userName: String, userPwd: String, responseResult: (String, String) -> Unit) =
    responseResult(userName, userPwd)


private fun loginEngine2(userName: String, userPwd: String, responseResult: (Boolean) -> Unit) {
    if (userName == "123456" && userPwd == "123456") {
        responseResult(true)
    } else responseResult(false)
}